package co.edu.udistrital.audiomixer.util;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Date;

import javax.ejb.Stateless;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ntp.TimeStamp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Stateless
public class FtpUtil {
	
	private final static Logger LOG = LoggerFactory.getLogger(FtpUtil.class);

	// Instanciamos FTPClient
	FTPClient ftpClient = new FTPClient();

	public void conectarFtp() {
		try {
			// Facilitamos la dirección del host al que vamos a subir nuestro
			// archivo
			ftpClient.connect("127.0.0.1");
			// Indicamos el usuario y contraseña del servidor, necesario para
			// acceder
			ftpClient.login("edwin", "tato.ER27");
			
			ftpClient.enterLocalPassiveMode();
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String escribir(String archivo, byte[] bytes) throws Exception {
		conectarFtp();
		String ruta = archivo;
		try {
			archivo = ordenarCarpetas(archivo, true);
			BufferedInputStream local = new BufferedInputStream(
					new ByteArrayInputStream(bytes));
			boolean ok = ftpClient.storeFile(archivo, local);
			if (!ok) {
				String mensaje = "Error cargando ftp"
						+ ftpClient.getReplyCode() + "\n"
						+ ftpClient.getReplyString();
				throw new Exception(mensaje);
			}
			ruta = "ftp://" + ftpClient.getRemoteAddress().toString() + ruta;
			local.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		desconectar();
		return ruta;
	}

	private String ordenarCarpetas(String archivo, boolean crear) throws IOException, Exception {
		cambiarCarpeta("ArchivosAudioMixNow");

		for (String carpeta : archivo.split("/")) {
			if (!carpeta.isEmpty()) {
				if (carpeta.contains(".")) {
					archivo = carpeta;
				} else {
					if(crear){
						ftpClient.makeDirectory(carpeta);
					}
					cambiarCarpeta(carpeta);
				}
			}
		}
		return archivo;
	}

	private void cambiarCarpeta(String carpeta) throws IOException, Exception {
		boolean ok = ftpClient.changeWorkingDirectory(carpeta);
		if (!ok) {
			String mensaje = "Error cargando ftp" + ftpClient.getReplyCode()
					+ "\n" + ftpClient.getReplyString();
			throw new Exception(mensaje);
		}
	}

	public byte[] leer(String archivo) {
//		conectarFtp();
		byte[] bytes = null;
		try {
			
			
			URL url = new URL("ftp://edwin:tato.ER27@localhost/ArchivosAudioMixNow"+archivo);
			URLConnection con = url.openConnection();
			bytes = IOUtils.toByteArray( con.getInputStream());
//			
//			ByteArrayInputStream baos = (ByteArrayInputStream) con.getInputStream();
////			archivo = ordenarCarpetas(archivo,false);
//			LOG.info("INICIO: "+new TimeStamp(new Date()).toDateString());
//			boolean ok = ftpClient.retrieveFile(archivo,baos);
//			LOG.info("FIN: "+new TimeStamp(new Date()).toDateString());
//			if (!ok) {
//				String mensaje = "Error cargando ftp"
//						+ ftpClient.getReplyCode() + "\n"
//						+ ftpClient.getReplyString();
//				throw new Exception(mensaje);
//			}
//			bytes =  baos.toByteArray();
//			baos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		desconectar();
		return bytes;
	}

	public void desconectar() {
		try {
			ftpClient.logout();
			ftpClient.disconnect();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
